#ifndef __DRIVER_LCD_H_
#define __DRIVER_LCD_H_
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
#include "sys.h"
#include "Driver_spi.h"
#include "delay.h"


#define ON  1   //打开显示
#define OFF 0   //关闭显示

//LCD的宽和高定义
#define USE_HORIZONTAL 0  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏

#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
    #define LCD_Width 135
    #define LCD_Height 240
#else
    #define LCD_Width 240
    #define LCD_Height 135
#endif

//LCD缓存大小设置，修改此值时请注意！！！！修改这两个值时可能会影响以下函数	
//LCD_Clear/LCD_Fill/LCD_DrawLine
#define LCD_TOTAL_BUF_SIZE	(240*135*2)
#define LCD_Buf_Size 1152
static u8 lcd_buf[LCD_Buf_Size];

/*----------------------------------
    LCD PWR --- PB7 背光
    LCD RST --- PB6 复位
    LCD DC  --- PB4 数据/命令选择
    LCD SDA --- PB5 数据SDA
    LCD SCL --- PB3 时钟SCL
    CS 片选引脚-直接接GND，一直使能
--------------------------------------*/
#define LCD_PWR(x) (x?(PBout(7)=1):(PBout(7)=0))
#define LCD_RST(x) (x?(PBout(6)=1):(PBout(6)=0))
#define LCD_DC(x)  (x?(PBout(4)=1):(PBout(4)=0))

//画笔颜色
#define WHITE         	 0xFFFF //白色
#define BLACK         	 0x0000	//黑色
#define BLUE         	 0x001F //蓝色
#define BRED             0XF81F 
#define GRED 			 0XFFE0
#define GBLUE			 0X07FF 
#define RED           	 0xF800 //红色
#define MAGENTA       	 0xF81F //品红色
#define GREEN         	 0x07E0 //绿色
#define CYAN          	 0x7FFF //青色
#define YELLOW        	 0xFFE0 //黄色
#define BROWN 			 0XBC40 //棕色
#define BRRED 			 0XFC07 //棕红色
#define GRAY  			 0X8430 //灰色

/*--------------------------------------------------------------
 * 功能: 打开\关闭 LCD显示 
 * 参数: on_off LCD开关状态
----------------------------------------------------------------*/
void LCD_Display_Status(u8 on_off);

/*--------------------------------------------------------------
 * 功能: 用一种颜色填充整个区域 
 * 参数: xsta ysta 起始点坐标
 * 参数: xend yend 终止点坐标
 * 参数: color 填充的颜色
----------------------------------------------------------------*/
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);

/*--------------------------------------------------------------
 * 功能: 清屏 
 * 参数: color 使用color颜色进行清屏 
----------------------------------------------------------------*/
void LCD_Clear(u16 color);

/*--------------------------------------------------------------
 * 功能: 画点函数（一个像素点太小几乎看不到）
 * 参数: x y 这个点的横纵坐标
 * 参数: color 点的颜色
----------------------------------------------------------------*/
void LCD_Draw_ColorPoint(u16 x, u16 y,u16 color);

/*--------------------------------------------------------------
 * 功能: 画线 
 * 参数: x_start y_start 起始坐标
 * 参数: x_end   y_end   终止坐标
 * 参数: color 线的颜色
----------------------------------------------------------------*/
void LCD_Draw_Line(u16 x_start,u16 y_start,u16 x_end,u16 y_end,u16 color);

/*--------------------------------------------------------------
 * 功能: 画矩形 
 * 参数: x1 y1 矩形左上角起始位置
 * 参数: x2 y2 矩形右下角终止位置
 * 参数: color 矩形的颜色
----------------------------------------------------------------*/
void LCD_Draw_Rectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);

/*--------------------------------------------------------------
 * 功能: 画圆
 * 参数: x y   圆心坐标
 * 参数: r     半径
 * 参数: color 圆的颜色 
----------------------------------------------------------------*/
void LCD_Draw_Circle(u16 x,u16 y,u8 r,u16 color);

/*--------------------------------------------------------------
 * 功能: 绘制一个字符 
 * 参数: x y 显示位置
 * 参数: chr 要显示的字符
 * 参数: size 字符大小（12、16、24、32需要提前制作对应大小的字库）
 * 参数: point_color 字符颜色
 * 参数: back_color  背景颜色
----------------------------------------------------------------*/
void LCD_ShowChar(u16 x, u16 y, char chr, u8 size,u16 point_color,u16 back_color);

/*--------------------------------------------------------------
 * 功能: 绘制字符串
 * 参数: x y 显示位置
 * 参数: width height 显示的高度和宽度
 * 参数: size 字符大小（12、16、24、32需要提前制作对应大小的字库）
 * 参数: *p 字符串指针
 * 参数: point_color 字符颜色
 * 参数: back_color 背景颜色
----------------------------------------------------------------*/
void LCD_ShowString(u16 x, u16 y, u16 width, u16 height, u8 size, char *p,u16 point_color,u16 back_color);

/*--------------------------------------------------------------
 * 功能: 显示数字 
 * 参数: x y 显示位置
 * 参数: num 要显示的数字，数字范围0~4294967295
 * 参数: len 要显示的位数
 * 参数: size 字体大小
 * 参数: point_color 字体颜色
 * 参数: back_color 背景颜色
----------------------------------------------------------------*/
void LCD_ShowNum(u16 x, u16 y, u32 num, u8 len, u8 size,u16 point_color,u16 back_color);

/*--------------------------------------------------------------
 * 功能: 显示两位小数 
 * 参数: x y 显示坐标
 * 参数: num 显示数字
 * 参数: len 要显示的位数（不包括小数点）
 * 参数: size 字号
 * 参数: point_color 字符颜色
 * 参数: back_color 字符背景色
----------------------------------------------------------------*/
void LCD_ShowFloatNum(u16 x,u16 y,float num,u8 len,u8 size,u16 point_color,u16 back_color);

/*--------------------------------------------------------------
 * 功能: 显示图片 
 * 参数: x y 起点坐标
 * 参数: length 图片长度
 * 参数: width 图片宽度
 * 参数: pic 图片数组
----------------------------------------------------------------*/
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[]);

/*--------------------------------------------------------------
 * 功能: 显示单个12x12汉字
 * 参数: x y 显示坐标
 * 参数: *s 要显示的汉字
 * 参数: point_color 字的颜色
 * 参数: back_color 字的背景色
 * 参数: size 字号
 * 参数: mode 0非叠加模式 1叠加模式
----------------------------------------------------------------*/
void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 point_color,u16 back_color,u8 size,u8 mode);

/*--------------------------------------------------------------
 * 功能: 显示单个16x16汉字
 * 参数: x y 显示坐标
 * 参数: *s 要显示的汉字
 * 参数: point_color 字的颜色
 * 参数: back_color 字的背景色
 * 参数: size 字号
 * 参数: mode 0非叠加模式 1叠加模式
----------------------------------------------------------------*/
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 point_color,u16 back_color,u8 size,u8 mode);

/*--------------------------------------------------------------
 * 功能: 显示单个24x24汉字
 * 参数: x y 显示坐标
 * 参数: *s 要显示的汉字
 * 参数: point_color 字的颜色
 * 参数: back_color 字的背景色
 * 参数: size 字号
 * 参数: mode 0非叠加模式 1叠加模式
----------------------------------------------------------------*/
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 point_color,u16 back_color,u8 size,u8 mode);

/*--------------------------------------------------------------
 * 功能: 显示单个32x32汉字
 * 参数: x y 显示坐标
 * 参数: *s 要显示的汉字
 * 参数: point_color 字的颜色
 * 参数: back_color 字的背景色
 * 参数: size 字号
 * 参数: mode 0非叠加模式 1叠加模式
----------------------------------------------------------------*/
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 point_color,u16 back_color,u8 size,u8 mode);

/*--------------------------------------------------------------
 * 功能: 显示汉字串 
 * 参数: x y 显示位置
 * 参数: *s  要显示的字符串
 * 参数: point_color 字的颜色
 * 参数: back_color  字的背景颜色
 * 参数: size 字号 可选12 16 24 32
 * 参数: mode 0非叠加模式  1叠加模式
----------------------------------------------------------------*/
void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 point_color,u16 back_color,u8 size,u8 mode);


/*--------------------------------------------------------------
 * 功能: 初始化
    LCD PWR --- PB7 背光
    LCD RST --- PB6 复位
    LCD SDA --- PB5 数据MOSI
    LCD DC  --- PB4 数据/命令选择
    LCD SCL --- PB3 时钟CLK
    CS 片选引脚-直接接GND，一直使能
----------------------------------------------------------------*/
void LCD_init(void);


#endif
